package org.myapp.datastore;


import java.io.Serializable;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;
import com.google.appengine.api.datastore.Transaction;

/**
 * レコードクラス.<br>
 *
 * @author Administrator
 *
 */
public class DataModel implements Serializable {

    private static final long serialVersionUID = 3782294937830037444L;
    private static final int STRING_MAX_LENGTH = 499;
    private Entity entity;

    /**
     * コンストラクタ.<br>
     * @param e エンティティ
     */
    public DataModel(Entity e) {
        entity = e;
    }

    public DataModel(String kind) {
        entity = new Entity(kind);
    }

    public final String getKind() {
        return entity.getKind();
    }

    /**
     * エンティティキーを取得.<br>
     * @return エンティティキー
     */
    public final long getKey() {
        return entity.getKey().getId();
    }

    /**
     * 値をセット.<br>
     * @param name property
     * @param value value
     */
    public void setProperty(String name, Object value) {
        if (value instanceof String && ((String)value).length() > STRING_MAX_LENGTH) {
            entity.setProperty(name, new Text( (String) value));
            return;
        }
        entity.setProperty(name, value);
    }

    /**
     * 値を取得.<br>
     * @param name property
     * @return Object
     */
    public Object getProperty(String name) {

        if (entity == null || !entity.hasProperty(name)) {
            return null;
        }

        Object value = entity.getProperty(name);
        if (value instanceof Text) {
            return ((Text) value).getValue();
        }
        return value;
    }

    public Key save() {
        return Store.get().put(entity);
    }

    public Key save(Transaction tx) {
        return Store.get().put(tx, entity);
    }

    public void delete() {
        Store.get().delete(entity.getKey());
    }

    public void delete(Transaction tx) {
        Store.get().delete(tx, entity.getKey());
    }
}
